Ссылка на практикум

Для выполнения практикума необходимо установить необходимые переменные:
export PATH=${PATH}:/home/preps/golovin/progs/bin
export MOPAC_LICENSE=/home/preps/golovin/progs/bin

  1. Создадим файл со SMILES-записью порфирина:
In [1]:
%%bash
echo "c1cc2cc3ccc(cc4ccc(cc5ccc(cc1n2)[nH]5)n4)[nH]3  porphyrin" > 1.smi

С помощью программы из openbabel посторим 3D-модель порфирина:

In [29]:
%%bash
obgen 1.smi > 1.mol 2&> /dev/null
In [17]:
%%bash
pymol 1.mol

2 последних водорода (39-ый и 40-ой) оказались лишними.

In [1]:
from xmlrpclib import ServerProxy
from IPython.display import Image
import os, sys

# pymol launching
import __main__

__main__.pymol_argv = [ 'pymol', '-x' ]

### Если вывод в графическое окно тормозит или не нужен, то:
##__main__.pymol_argv = [ 'pymol', '-cp' ]


import pymol
 
pymol.finish_launching()
 
from pymol import cmd

### Информацию об ошибках можно смотреть там где запускали  ipython notebook

### Будем вставлять файлы изображений 

from IPython.display import Image
In [2]:
def Img(name):
    cmd.ray()
    cmd.png(name)
In [39]:
cmd.delete('all')
cmd.load("1.mol")
cmd.label(selection='id 39-40', expression='" %s" % ID')
cmd.ray()
cmd.png("1.png")
Out[39]:
1

Вот они, торчат из плоскости:

In [12]:
Image(filename='1.png')
Out[12]:

Уберём их:

In [40]:
cmd.remove("id 39-40")
cmd.save("1.pdb")
In [7]:
#cmd.delete('all')
#cmd.load("1.pdb")
cmd.ray()
cmd.png('2.png')
Out[7]:
1
In [14]:
Image(filename='2.png')
Out[14]:

Готово. Однако он до сих пор не плоский:

In [41]:
cmd.rotate(axis='x', angle=90)
cmd.ray()
cmd.png('2_2.png')
Image(filename='2_2.png')
Out[41]:

Теперь переформатируем координаты в mol формате во входной файл для Mopac (c типом параметризации "pm6"):

In [62]:
%%bash
babel -ipdb 1.pdb -omop 1_opt.mop -xk "PM6"

Запустим Mopac:

In [63]:
%%bash 
MOPAC2009.exe 1_opt.mop

Переведём результат в pdb:

In [64]:
%%bash
babel -imopout 1_opt.out -opdb 1_opt.pdb
In [53]:
cmd.delete('all')
cmd.load('1_opt.pdb')
cmd.rotate(axis='x', angle=90)
cmd.ray()
cmd.png("1_opt.png")
Out[53]:
1

Он стал плоским!

In [22]:
Image(filename='1_opt.png')
Out[22]:

Попробуем провести оптипизацию "AM1":

In [2]:
%%bash
babel -ipdb 1.pdb -omop  2_opt.mop -xk "AM1"
MOPAC2009.exe 2_opt.mop
babel -imopout 2_opt.out -opdb 2_opt.pdb
In [4]:
cmd.delete('all')
cmd.load('2_opt.pdb')
cmd.rotate(axis='x', angle=90)
cmd.ray()
cmd.png("2_opt.png")
Out[4]:
1

Визуально разницы не видно:

In [6]:
Image(filename='2_opt.png')
Out[6]:

Наложим изображения друг на друга:

In [13]:
cmd.delete('all')
cmd.load('1_opt.pdb')
cmd.color('tv_red', '1_opt')
cmd.load('2_opt.pdb')
cmd.color('tv_blue', '2_opt')
In [14]:
cmd.ray()
cmd.png("sup_opt.png")
Image(filename='sup_opt.png')
Out[14]:

При увеличении видно, что структуры немного расходятся, особенно водороды. Значит в одной из оптимизаций структура получается менее плоской.

  1. Рассчитаем возбужденные состояния порфирина и спектр поглощения молекулы.
In [3]:
%%bash
cp 1_opt.mop 1_opt_spectr.mop
echo "" >> 1_opt_spectr.mop
echo "cis c.i.=4 meci oldgeo" >> 1_opt_spectr.mop
echo "some description" >> 1_opt_spectr.mop
MOPAC2009.exe 1_opt_spectr.mop
In [11]:
f = open('1_opt_spectr.out', 'r')
lines = f.readlines()[-15:-7]
f.close()
energies = [float(line.split()[1]) for line in lines]
print energies, 'eV'
[1.914982, 2.267356, 2.464879, 2.82651, 3.365178, 3.39249, 3.669238, 3.872141] eV

Получили энергии электронных переходов. Рассчитаем соотвутствующие им длины волн и частоты по формулам: \[\nu (PHz)=\frac{E(eV)}{h(eV \cdot s)}\] \[\lambda(nm)=\frac{h(eV \cdot s)c(m/s)}{E(eV)}\]

In [59]:
wavelengths = [1239.84193/e for e in energies]
frequencies = [e/4.135667516 for e in energies]
print 'frequncy, THz\t wavelength, nm\tenergy, eV'
for i in range(len(energies)):
    print '{:^13.0f}\t{:^15.0f}\t{:^10.2f}'.format(frequencies[i]*1000, wavelengths[i], energies[i])
    
frequncy, THz	 wavelength, nm	energy, eV
     463     	      647      	   1.91   
     548     	      547      	   2.27   
     596     	      503      	   2.46   
     683     	      439      	   2.83   
     814     	      368      	   3.37   
     820     	      365      	   3.39   
     887     	      338      	   3.67   
     936     	      320      	   3.87   

  1. Определим геометрию молекулы O=C1C=CC(=O)C=C1 (бензохинона):
In [28]:
%%bash
echo 'O=C1C=CC(=O)C=C1    benzoquinone' > quinone.smi
obgen quinone.smi > quinone.mol 2&> /dev/null
In [14]:
cmd.reinitialize()
cmd.load('quinone.mol')
cmd.save("quinone.pdb")
cmd.show('spheres', 'all')
cmd.show('sticks', 'all')
cmd.do("set valence, on")
cmd.do("set_bond stick_radius, 0.14, (all), (all)")
cmd.do("set sphere_scale, 0.25, (all)")
cmd.ray()
cmd.png('quinone_obgen.png')
Image(filename='quinone_obgen.png')
Out[14]:
In [90]:
cmd.rotate(axis='x', angle=90)
cmd.ray()
cmd.png('quinone_obgen2.png')
Image(filename='quinone_obgen2.png')
Out[90]:

Он плоский. Даже не хочется запускать Mopac..

In [93]:
%%bash
babel -ipdb quinone.pdb -omop quinone_pm6.mop -xk "PM6"
MOPAC2009.exe quinone_pm6.mop
babel -imopout quinone_pm6.out -opdb quinone_pm6.pdb
In [16]:
cmd.delete('all')
cmd.load('quinone_pm6.pdb')
cmd.do("set valence, on")
cmd.ray()
cmd.png('quinone_mopac.png')
Image(filename='quinone_mopac.png')
Out[16]:
In [17]:
cmd.rotate(axis='x', angle=90)
cmd.ray()
cmd.png('quinone_mopac2.png')
Image(filename='quinone_mopac2.png')
Out[17]:
In [120]:
cmd.reinitialize()
cmd.load('quinone_pm6.pdb')
cmd.color('tv_red', 'quinone_pm6')
cmd.load('quinone.pdb')
cmd.color('tv_blue', 'quinone')
cmd.ray()
cmd.png('quinone_align.png')
Image(filename='quinone_align.png')
Out[120]:
In [121]:
cmd.rotate(axis='x', angle=90)
cmd.ray()
cmd.png('quinone_align2.png')
Image(filename='quinone_align2.png')
Out[121]:

Почти идентичны. Однако при пристальном изучении можно заметить, что неоптимизированная структура чуть менее плоская.
Повторим всё для дианиона:

In [124]:
f = open('quinone_pm6.mop', 'r')
content = f.read()
f.close()
content = content.replace('PM6', 'PM6 CHARGE=-2')
content = content.replace('O', 'O(-)')
g = open('quinone_pm6_anion.mop', 'w')
g.write(content)
g.close()
In [125]:
%%bash
MOPAC2009.exe quinone_pm6_anion.mop
babel -imopout quinone_pm6_anion.out -opdb quinone_pm6_anion.pdb
In [142]:
cmd.reinitialize()
cmd.load('quinone_pm6_anion.pdb')
cmd.color('tv_green', 'quinone_pm6_anion')
cmd.load('quinone_pm6.pdb')
cmd.color('tv_red', 'quinone_pm6')
cmd.ray()
cmd.png('quinone_align3.png')
Image(filename='quinone_align3.png')
Out[142]:

Хмм...

In [143]:
cmd.rotate(axis='x', angle=95)
cmd.ray()
cmd.png('quinone_align4.png')
Image(filename='quinone_align4.png')
Out[143]:

Структура плоской быть не перестала. Однако она вытянулась вдоль оси, проходящей по атомам кислорода: сами кислороды разъехались друг от друга (вестимо, из-за взаимодействия зарядов с \(\pi\)-системой), а бензольное кольцо сузилось. Но эти изменения, как мне кажется, не должны сильно превышать изменения от тепловых колебаний.

  1. Попробуем увидеть переход из тиминового димера в тимины при возбуждении системы:
In [2]:
%%bash
wget "http://kodomo.fbb.msu.ru/FBB/year_08/term6/td.pdb" -O td.pdb
--2016-03-09 18:16:59--  http://kodomo.fbb.msu.ru/FBB/year_08/term6/td.pdb
Resolving kodomo.fbb.msu.ru... 192.168.180.1
Connecting to kodomo.fbb.msu.ru|192.168.180.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2010 (2.0K) [chemical/x-pdb]
Saving to: `td.pdb.1'

     0K .                                                     100% 54.0M=0s

2016-03-09 18:16:59 (54.0 MB/s) - `td.pdb.1' saved [2010/2010]


In [19]:
cmd.reinitialize()
cmd.load('td.pdb')
cmd.do('set valence, on')
Img('td.png')
Image(filename='td.png')
Out[19]:

Оптимизируем структуру с параметрами PM6 при зараде 0:

In [25]:
%%bash
babel -ipdb td.pdb -omop td.mop -xk "PM6"
MOPAC2009.exe td.mop
babel -imopout td.out -opdb td_opt.pdb
In [22]:
cmd.reinitialize()
cmd.load('td_opt.pdb')
cmd.do('set valence, on')
Img('td_opt.png')
Image(filename='td_opt.png')
Out[22]:

Оптимизируем результат при заряде +2 (имитируем возбуждённое состояние):

In [29]:
%%bash
babel -ipdb td_opt.pdb -omop td_opt2.mop -xk "PM6"
sed -i 's/PM6/PM6 CHARGE=+2/' td_opt2.mop
MOPAC2009.exe td_opt2.mop
babel -imopout td_opt2.out -opdb td_opt2.pdb
In [30]:
cmd.reinitialize()
cmd.load('td_opt2.pdb')
cmd.do('set valence, on')
Img('td_opt2.png')
Image(filename='td_opt2.png')
Out[30]:
In [31]:
%%bash
babel -ipdb td_opt2.pdb -omop td_opt0.mop -xk "PM6"
sed -i 's/PM6 CHARGE=+2/PM6/' td_opt0.mop
MOPAC2009.exe td_opt0.mop
babel -imopout td_opt0.out -opdb td_opt0.pdb
In [51]:
cmd.reinitialize()
cmd.load('td_opt0.pdb')
cmd.do('set valence, on')
cmd.rotate(axis='y', angle='-20')
Img('td_opt0.png')
Image(filename='td_opt0.png')
Out[51]:

Как следует из рисунков, при возбуждении системы полного разрушения тиминового димера не произошло. Однако, если я правильно могу интерпретировать результаты, возбуждённое состояние оказалось переходным, из которого система может свалиться как в тиминовые нуклеотиды, так и обратно в димер. А так как система из двух тиминов (-3273.69661 eV) оказалась немного выгодней системы из димера (-3273.58217 eV), то она свалилась именно в тимины.

  1. Попробуем восстановить ион магния в структуре:
In [59]:
%%bash
wget "http://kodomo.fbb.msu.ru/FBB/year_08/term6/test.pdb" -O atp.pdb
In [61]:
cmd.reinitialize()
cmd.load('atp.pdb')
Img('atp.png')
Image(filename='atp.png')
Out[61]:

Добавим к структуре водороды при pH=7:

In [75]:
%%bash
babel -ipdb atp.pdb -omop atp.mop -xk "PM6" -p 7
babel -imop atp.mop -opdb atpH.pdb
In [13]:
cmd.reinitialize()
cmd.load('atpH.pdb')
cmd.set_view ('\
     0.850807786,    0.185234621,   -0.491741031,\
    -0.098345406,    0.975402892,    0.197270557,\
     0.516186953,   -0.119479574,    0.848098159,\
     0.000000000,    0.000000000,  -40.559150696,\
   -27.376327515,   24.080129623,    6.675564289,\
    31.977142334,   49.141159058,  -20.000000000' )
Img('atpH.png')
Image(filename='atpH.png')
Out[13]:

Добавим к структуре магний:

In [2]:
%%bash
cp atp.mop atpMg.mop
sed -i 's/O  -29.24900 1 25.83400 1  5.04800 1/O  -29.24900 1 25.83400 1  5.04800 1\nMg -29.15500 1 26.47700 1  5.32550 1/' atpMg.mop
babel -imop atpMg.mop -opdb atpMg.pdb
1 molecule converted
22 audit log messages 

In [12]:
cmd.reinitialize()
cmd.load('atpMg.pdb')
cmd.label(selection='all', expression='" %s" % ID')
Img('atpMg.png')
Image(filename='atpMg.png')
Out[12]:

Запретим движение для всех атомов кроме \(\alpha, \gamma\)-фосфатов, воды и магния:

In [20]:
f = open('atpMg.mop', 'r')
content = f.readlines()
f.close()
s = ''
atomsIDs = [9,41,61,62,12,25,29,33,10,23,27,31,32,14]
for index, line in enumerate(content):
    if index<3:
        s += line
    elif index-2 not in atomsIDs:
        temp = line.split()
        s += "{:3}{:9} 0 {:8} 0 {:>8} 0\n".format(temp[0], temp[1], temp[3], temp[5])
    else:
        s += line
g = open('atpMgfreez.mop', 'w')
g.write(s)
g.close()

Сделаем заряд структуры -3:

In [21]:
%%bash
cp atpMgfreez.mop atpMgfreez-without_charge.mop
sed -i 's/PM6/PM6 CHARGE=-3/' atpMgfreez.mop

Запустим оптимизацию:

In [13]:
%%bash
MOPAC2009.exe atpMgfreez.mop
babel -imopout atpMgfreez.out -opdb atpMgfreez.pdb
In [15]:
cmd.reinitialize()
cmd.load('atpMgfreez.pdb')
cmd.distance("id 9","id 41")
cmd.distance("id 9","id 8")
cmd.distance("id 9","id 27")
cmd.distance("id 9","id 29")
cmd.distance("id 9","id 24")
cmd.show('spheres', 'id 9')
cmd.do("set sphere_scale, 0.25, (id 9)")
cmd.set_view ('\
     0.850807786,    0.185234621,   -0.491741031,\
    -0.098345406,    0.975402892,    0.197270557,\
     0.516186953,   -0.119479574,    0.848098159,\
     0.000000000,    0.000000000,  -40.559150696,\
   -27.376327515,   24.080129623,    6.675564289,\
    31.977142334,   49.141159058,  -20.000000000' )
Img('atpMgfreez.png')
Image(filename='atpMgfreez.png')
Out[15]:
In [19]:
cmd.load('atpMg.pdb')
cmd.color('cyan', 'atpMg')
Img('atpMgalign.png')
Image(filename='atpMgalign.png')
Out[19]:

Как видно из последнего рисунка, при оптимизации передвинулись атомы Mg, воды и \(\gamma\)-фосфата. Атомы \(\alpha\)-фосфата остались на месте, не смотря на то, что им было разрешено двигаться.

Ион магния занял положение, при котором он координируется 5-ю связями (с водой, кислородом аспартата и кислородами фосфатов).

А что если Mopac не сообщить информацию о заряде системы:

In [25]:
%%bash
MOPAC2009.exe atpMgfreez-without_charge.mop
babel -imopout atpMgfreez-without_charge.out -opdb atpMgfreez-without_charge.pdb
In [27]:
cmd.reinitialize()
cmd.load('atpMgfreez-without_charge.pdb')
cmd.distance("id 9","id 41")
cmd.distance("id 9","id 8")
cmd.distance("id 9","id 27")
cmd.distance("id 9","id 29")
cmd.distance("id 9","id 24")
cmd.show('spheres', 'id 9')
cmd.do("set sphere_scale, 0.25, (id 9)")
cmd.set_view ('\
     0.850807786,    0.185234621,   -0.491741031,\
    -0.098345406,    0.975402892,    0.197270557,\
     0.516186953,   -0.119479574,    0.848098159,\
     0.000000000,    0.000000000,  -40.559150696,\
   -27.376327515,   24.080129623,    6.675564289,\
    31.977142334,   49.141159058,  -20.000000000' )
cmd.load('atpMgfreez.pdb')
cmd.color('cyan', 'atpMgfreez')
Img('atpMgalign2.png')
Image(filename='atpMgalign2.png')
Out[27]:

В общем, мягко говоря, результаты изменились. Трифосфатная группа неестественно изогнулась, вода переместилась, кислороды \(\gamma\)-фосфата сблизилсь чересчур близко (т.к. на них нет зарядов и они слабее отталкиваются), однако магний всё равно занял своё законное положение.